import processing.video.*;
Capture cam;

int numPixels;                      // number of pixels in the video
int rectDivide = 1;                 // the stage width/height divided by this number is the video width/height 
int vidW;                           // video width
int vidH;                           // video height
int[][] colouredPixels;             // the different colour references for each pixel
int[][] colourCompareData;          // captured r, g and b colours
int currR;                          //
int currG;                          //
int currB;                          //
int[][] squareCoords;               // x, y, w + h of the coloured areas
color[] colours;                    // captured colours
int colourRange = 25;               // colour threshold
int[][] centrePoints;               // centres of the coloured squares
color[] pixelColours;
boolean isShowPixels = false;       // determines whether the square and coloured pixels are displayed
int colourMax = 2;                  // max amount of colours - also adjust the amount of colours added to pixelColours in setup()
int coloursAssigned = 0;            // amount of cours currently assigned
CoordsCalc coordsCalc;

void setup() 
{
  size(640, 480);
  vidW = width / rectDivide;
  vidH = height / rectDivide;
  cam = new Capture(this, vidW, vidH, 30);
  noStroke();
  numPixels = vidW * vidH;
  colouredPixels = new int[vidH][vidW];
  colourCompareData = new int[colourMax][3];
  squareCoords = new int[colourMax][4];
  colours = new color[colourMax];
  centrePoints = new int[colourMax][2];
  color c1 = color(0, 255, 0);
  color c2 = color(255, 0, 0);
  pixelColours = new color[colourMax];
  pixelColours[0] = color(0, 255, 0);
  pixelColours[1] = color(255, 0, 0);
  coordsCalc = new CoordsCalc();
  cam.start();
}

void captureEvent(Capture cam) 
{
  cam.read();
}

void draw() 
{
  noStroke();
  fill(255, 255, 255);
  rect(0, 0, width, height);
  drawVideo();
  coordsCalc.update();
  for (int i = 0; i < coloursAssigned; i++)
  {
    if (isShowPixels) drawSquare(i);
  }
}


void drawVideo()
{
  for (int i = 0; i < coloursAssigned; i++)
  {
    fill(colours[i]);
    rect(i * 10, vidH, 10, 10);
  }
  image(cam, 0, 0);
  noFill();
  stroke(255, 0, 0);
  strokeWeight(2);
}

void drawSquare(int i)
{
  int sqX = squareCoords[i][0];
  int sqY = squareCoords[i][1];
  int sqW = squareCoords[i][2];
  int sqH = squareCoords[i][3];
  noFill();
  stroke(0, 0, 255);
  strokeWeight(3);
  rect(sqX, sqY, sqW, sqH);
  
  //stroke(0, 0, 255);
  //strokeWeight(4);
  rect(sqX * rectDivide, sqY * rectDivide, sqW * rectDivide, sqH * rectDivide);
  line(sqX * rectDivide, sqY * rectDivide, ((sqX * rectDivide) + (sqW * rectDivide)), ((sqY * rectDivide) + (sqH * rectDivide)));
  line(((sqX * rectDivide) + (sqW * rectDivide)), sqY * rectDivide, sqX * rectDivide, (sqY * rectDivide + sqH * rectDivide));
}

void mouseClicked() {
  color currPixColor = cam.pixels[mouseX + vidW * mouseY];
  int pixR = (currPixColor >> 16) & 0xFF;
  int pixG = (currPixColor >> 8) & 0xFF;
  int pixB = currPixColor & 0xFF;
  
  if (coloursAssigned == 0) 
  {
    coloursAssigned = 1;
    colourCompareData[0][0] = pixR;
    colourCompareData[0][1] = pixG;
    colourCompareData[0][2] = pixB;
    colours[0] = color(pixR, pixG, pixB);
    return;
  }
  if (colourMax < 2 || coloursAssigned < 1) return;
  if (coloursAssigned == 1) 
  {
    coloursAssigned = 2;
    colourCompareData[1][0] = pixR;
    colourCompareData[1][1] = pixG;
    colourCompareData[1][2] = pixB;
    colours[1] = color(pixR, pixG, pixB);
    return;
  }
  if (coloursAssigned == 2) {
    coloursAssigned = 0;
  }
}

void keyPressed() 
{
  println("key pressed = " + key);

  if (key == 'p') 
  {
    isShowPixels = !isShowPixels;
  }
  
  if (key == '0') 
  {
    coloursAssigned = 0;
  }
}
